#include "MessageQueue.hh"

MessageQueue::MessageQueue( int id )
{
    do{
        keyId = ftok( fname, id );
        if( keyId < 0 ){
            logError( "ftok : %s\n", strerror(errno) );
            break;
        }

        msgId = msgget( keyId, 0666 | IPC_CREAT | IPC_EXCL );
        if( msgId < 0 ){
            msgId = msgget( keyId, 0666 | IPC_CREAT );
            if( msgId < 0 ){
                logError( "Shmget : %s\n", strerror(errno) );
                break;
            }
        }else{
            logInfo("\n");
            createMsg = true;
        }

    }while(0);
}

MessageQueue::~MessageQueue()
{
    if( createMsg == true ){
        msgctl( msgId, IPC_RMID, NULL );
    }
}

MessageQueue* MessageQueue::createNew(int id )
{
    return new MessageQueue( id );
}

int MessageQueue::SendMesage( long int msgType, MSG_DATA data, int msgflg )
{
    int ret = MSGQUEUE_SUCCESS;

    do{
        if( msgId < 0 ){
            ret = MSGQUEUE_INVALID;
            logError("Message queue invalid...\n");
            break;
        }
        MESSAGE_QUEUE_HANDLE mQueue;
        mQueue.message_type = msgType;
        memcpy( &mQueue.msgData, &data, sizeof(MSG_DATA));

        if( msgsnd( msgId, &data, sizeof(MSG_DATA), msgflg ) < 0 ){
#ifdef MSG_DEBUG
            perror("msgsnd");
            logError("id : %d,msgType %ld, msgsnd error:%s\n", msgId, msgType, strerror(errno) );
#endif
            ret = MSGQUEUE_SENDERR;
            break;
        }

    }while(0);

    return ret;
}

int MessageQueue::RecvMesage( long int msgType, MSG_DATA &data, int msgflg ){
    int ret = MSGQUEUE_SUCCESS;

    do{
        if( msgId < 0 ){
            ret = MSGQUEUE_INVALID;
            logError("Message queue invalid...\n");
            break;
        }

        MESSAGE_QUEUE_HANDLE mQueue;
        if( msgrcv( msgId, &mQueue, sizeof(MSG_DATA), msgType, msgflg ) < 0 ){
#ifdef MSG_DEBUG
            logError("id : %d,msgType %ld, msgrcv error:%s\n", msgId, msgType, strerror(errno) );
#endif
            ret = MSGQUEUE_SENDERR;
            break;
        }

        data = mQueue.msgData;

    }while(0);

    return ret;
}

